package com.example.demo.aop;


import com.alibaba.fastjson.JSON;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @author czj
 */
@Component
@Aspect
public class AopAspect {
    //within 用于匹配指定类型内的方法执行
//    @Pointcut("within(ManageService)")根据接口名切
//    @Pointcut("@annotation(CutPoint)")创建一个注解更具注解切
    //根据包下方法名切
    @Pointcut("execution(* com.example.demo.aop.*.action*())")
    public void pointcut() {
        System.out.println("切入开始计时! ");
    }
    /**
       @Before：前置通知，在调用目标方法之前执行通知定义的任务
       @After：后置通知，在目标方法执行结束后，无论执行结果如何都执行通知定义的任务
       @After-returning：后置通知，在目标方法执行结束后，如果执行成功，则执行通知定义的任务
       @After-throwing：异常通知，如果目标方法执行过程中抛出异常，则执行通知定义的任务
       @Around：环绕通知，在目标方法执行前和执行后，都需要执行通知定义的任务
     */
    @Around("pointcut()")
    public Object invokeMethod(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("开始执行... ");
        Object proceed = pjp.proceed();

        long end = System.currentTimeMillis();
        System.out.println("结束执行... " + JSON.toJSONString(proceed));
        System.out.println("调用共使用时间:" + (end - start) + "ms");
        return proceed;
    }
}
